home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / HardwareProjects / VideoText.lha / VideoText4.2 / source / i2cscan.p < prev    next >
Encoding:
Text File  |  1995-01-08  |  3.3 KB  |  90 lines

  1. PROGRAM i2cscan;
  2. { Schaut, wer am I²C-Bus angeschlossen ist und zuhört. }
  3. FROM vt USES i2c_serial;
  4.  
  5. CONST SAA5246 = $22;
  6.       SAA4700 = $20;
  7.       SAA1064 = $70;
  8.  
  9. VAR i,j: integer;
  10.     buffer: ARRAY [1..20] OF Byte;
  11.     rd,wr: Boolean;
  12.     s: String[16];
  13.  
  14. PROCEDURE hexwrite(x: Byte);
  15. var hi,lo: Byte;
  16.     s: String[16];
  17. BEGIN
  18.   s := '123456789ABCDEF';  { 0 fehlt, macht aber nichts }
  19.   hi := x SHR 4; lo := x AND $F;
  20.   IF hi < 10 THEN Write(hi) ELSE Write(s[hi]);
  21.   IF lo < 10 THEN Write(lo) ELSE Write(s[lo]);
  22. END;
  23.  
  24. PROCEDURE identify(adr: Byte);
  25. { Nicht besonders aussagekräftig: die meisten Chips lassen sich auf -zig }
  26. { verschiedene Adressen einstellen, haben diese dann aber mit mehreren }
  27. { anderen gemeinsam. }
  28. BEGIN
  29.   IF adr IN [$20,$22] THEN Write('SAF1135/SAA4700/'); { VPS-Decoder }
  30.   IF adr = $20 THEN Write('PCF8200/'); { Sprach-Synthesizer }
  31.   IF adr = $22 THEN Write('SAA5243/SAA5246/'); { Videotext-Decoder }
  32.   IF adr IN [$40..$4E] THEN Write('PCF8574/'); { 8 bit I/O Expander }
  33.   IF adr IN [$40..$4E] THEN Write('TDA8444/'); { 8 × 6 bit D/A-Wandler }
  34.   IF adr IN [$70,$72] THEN Write('PCF8576/'); { LCD-Treiber 1-4 × 40 }
  35.   IF adr IN [$70..$7E] THEN Write('PCF8574A/'); { 8 bit I/O Expander }
  36.   IF adr IN [$70..$76] THEN Write('SAA1064/'); { LED-Treiber/Busexpander }
  37.   IF adr = $74 THEN Write('PCF8577/'); { LCD-Treiber 1-2 × 32 }
  38.   IF adr = $76 THEN Write('PCF8577A/'); { LCD-Treiber 1-2 × 32 }
  39.   IF adr IN [$78,$7A] THEN Write('PCF8578/'); { LCD-Punktmatrix-Treiber. }
  40.   { Mögliche Konfigurationen: 32×8, 24×16, 16×24, 8×32. Als Erweiterung }
  41.   { um jeweils 40 Spalten (ohne eigene Multiplexsteuerung): PCF8579. }
  42.   IF adr IN [$7C,$7E] THEN Write('PCF8566/'); { LCD-Treiber 1-4 × 24 }
  43.   IF adr IN [$80..$86] THEN Write('SAA1300/'); { Leistungstreiber 5×85 mA }
  44.   IF adr = $88 THEN Write('TDA8442/'); { DAC u. Schalter für Farbdecoder }
  45.   { Ausgänge: 4 analog, 2 binär, 1 Leistungsausgang 14 mA }
  46.   IF adr IN [$90..$9E] THEN Write('PCF8591/'); { 8 bit DA/AD-Wandler }
  47.   IF adr IN [$90..$9E] THEN Write('TDA8440/'); { AV-Quellenumschalter 2A, 1V }
  48.   IF adr IN [$A0..$AE] THEN Write('PCF8570/PCF8571'); { 256/128 Byte SRAM }
  49.   IF adr IN [$A0..$AE] THEN Write('PCF8581/PCF8582'); { 256/128 Byte EEPROM }
  50.   IF adr IN [$A0,$A2] THEN Write('PCF8583/'); { Uhr/Kalender/256 Byte SRAM }
  51.   IF adr IN [$B0..$BE] THEN Write('PCF8570C/'); { 256 Byte SRAM }
  52.   IF adr IN [$D0..$D6] THEN Write('PCF8573/'); { Uhr/Kalender }
  53.   Write(#8);
  54. END;
  55.  
  56. PROCEDURE report(i2c_status: Byte);
  57. BEGIN
  58.   IF i2c_status>2 THEN
  59.     WriteLn('I²C-Bus: Err',i2c_status,', ',i2c_error[i2c_status]);
  60. END;
  61.  
  62. BEGIN
  63.   i := Pos('-d',ParameterStr);
  64.   IF i>0 THEN BEGIN
  65.     s := Copy(ParameterStr,i+2,15);
  66.     j := 1; WHILE s[j] IN ['0'..'9'] DO Inc(j);
  67.     s[j] := #0;
  68.     Val(s,busdelay,i);
  69.   END;
  70.   WriteLn('Teilnehmer am I²C-Bus:');
  71.   FOR i := 0 TO 127 DO BEGIN
  72.     i2cbusIO(2*i+1,^buffer,-1); rd := i2c_status=0;
  73.     report(i2c_status);
  74.     i2cbusIO(2*i,^buffer,0); wr := i2c_status=0;
  75.     report(i2c_status);
  76.     IF rd OR wr THEN BEGIN
  77.       Write('Chip-Adresse $');
  78.       IF rd AND wr THEN BEGIN
  79.         hexwrite(2*i); Write('/$'); hexwrite(2*i+1); Write(': R/W  (');
  80.       END ELSE IF rd THEN BEGIN
  81.         hexwrite(2*i+1); Write(':  R only  (');
  82.       END ELSE BEGIN
  83.         hexwrite(2*i); Write(':  W only  (');
  84.       END;
  85.       identify(2*i); WriteLn(')');
  86.     END;
  87.   END;
  88. END.
  89.  
  90.